package com.itheima.jdkdaili;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @author 李先生
 */
public class ProxyTest {
    public static void main(String[] args) {
        //获取奶茶对象-上奶茶
        MyTea myTea = new MyTea();
        myTea.zuo();
        myTea.getTea();
        //代理对象

        /*
         * ClassLoader, 加载这个对象的类加载器
         * Class<?>{} interfaces, 这个对象的接口类型
         * InvocationHandler, 处理规则
         * proxyTea 代理后的对象 == hongTea
         */

        Tea proxyTea = (Tea) Proxy.newProxyInstance(myTea.getClass().getClassLoader(),
                new Class[]{Tea.class},
                new InvocationHandler() {
                    /*
                     * invoke               代理规则(代理对象执行一次方法，就会执行一次invoke)
                     * @param proxy         代理对象
                     * @param method        代理执行的方法对象
                     * @param args          执行这个方法传递的参数
                     * @return 返回值
                     * @throws Throwable    抛出异常
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("执行到方法为=" + method.getName());
                        System.out.println(Arrays.toString(args));

                        if ("getTea".equals(method.getName())) {
                            //代理...
                            System.out.println("加点红豆");
                            method.invoke(myTea,args[0]);
                            System.out.println("送你一朵小红花");
                            return null;
                        } else {
                            return proxy;
                        }
                    }
                });
        //代理对象执行
        System.out.println("-----------------------------");
        proxyTea.zuo();
//        proxyTea.getTea();
        proxyTea.getTea("红豆豆");
    }
}
